package com.sn.system.common.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidatorUtils {

	/** 氏名（漢字）チェック用：
	 * 　　　　　　　　　　　　　　　漢字：一-龠
	 * 　　　　　　　　　　　　　　　全角平仮名と全角片仮名：\u3040-\u30ff
	 * 　　　　　　　　　　　　　　　全角英小文字：ａ-ｚ
	 * 　　　　　　　　　　　　　　　全角英大文字：Ａ-Ｚ
	 * 　　　　　　　　　　　　　　　全角数字　　　：０-９
	 * 　　　　　　　　　　　　　　　踊り字　　　　　：々
	 * 　　　　　　　　　　　　　　　長音記号　　　：ー
	 * 　　　　　　　　　　　　　　　全角スペース　：　
	 */
	public static final String Kanzisimei="^[一-龠\u3040-\u30ffａ-ｚＡ-Ｚ０-９々ー　]+$";

	/**　氏名（かな）チェック用：全角平仮名と長音記号、全角スペースのみ　*/
	public static final String NotHalfHirakana="^[\u3040-\u309f　ー]+$";

	/**　○○名称チェック用： 半角英数、半角記号、半角カナ不可 
	 *                半角英数記号：\u0020-\u007e　\u00a1-\u00df　               
	 *                半角片仮名　：\uff66-\uff9f
	 */
	public static final String NotHalfKatakana="^[^\u0020-\u007e^\u00a1-\u00df^\uff66-\uff9f]+$";
	
	/** 市町村などチェック用：全角文字
	 * 　　　　　　　　　　　　　　　（「半角英数、半角記号、半角カナ不可」 と同じ）
	 */
	public static final String NotHalfString="^[^\u0020-\u007e^\u00a1-\u00df^\uff66-\uff9f]+$";
	
	/** 年月日 YYYY/MM/DD */
	public static final String DateExpression="(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})\\/(((0[13578]|1[02])\\/(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)\\/(0[1-9]|[12][0-9]|30))|(02\\/(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))\\/02\\/29)";

	/** 半角英数 */
	public static final String HalfString="^[0-9a-zA-Z\uff66-\uff9f]*$";

	/** 半角数值 */
	public static final String HalfNumeric="^[0-9]*$";

	/** 電話番号 */
	public static final String telephone="^\\d{2,5}-\\d{2,4}-\\d{4}$";

	/** 携帯電話  */
	public static final String mobile="^\\d{2,5}-\\d{2,4}-\\d{4}$";

	/** ファックス*/
	public static final String fax="^\\d{2,5}-\\d{2,4}-\\d{4}$";

	/** 性別　*/
	public static final String sex="^[0]|[1]";

	/** 電話string */
	public static final String danwa="^[0-9-]*$";

	/** メールアドレス */
	public static final String emailAddressPattern =
    	"\\b(^['_A-Za-z0-9-]+(\\.['_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z0-9]{2,})|(\\.[A-Za-z0-9]{2,}\\.[A-Za-z0-9]{2,}))$)\\b";

	/**
     * 正規表現で YYYY/MM/DDチェック
     * @param str
     * @param expression
     * @return
     */
    public static boolean validatorDate(String str, String expression) {
        if (expression == null || expression.trim().length() == 0)
            expression = ValidatorUtils.DateExpression;
        return regexValidator(str,expression);
    }
	/**
     * 正規表現で半角英数チェック
     * @param str
     * @param expression
     * @return
     */
    public static boolean validatorHalfString(String str, String expression) {
        if (expression == null || expression.trim().length() == 0)
            expression = ValidatorUtils.HalfString;
        return regexValidator(str,expression);
    }

	/**
     * 正規表現で半角数值チェック
     * @param str
     * @param expression
     * @return
     */
    public static boolean validatorHalfNumeric(String str, String expression) {
        if (expression == null || expression.trim().length() == 0)
            expression = ValidatorUtils.HalfNumeric;
        return regexValidator(str,expression);
    }

	/**
     * 正規表現で  ひらがなのみ /半角カナ不可 チェック
     * @param str
     * @param expression
     * @return
     */
    public static boolean validatorNotHalfKana(String str, String expression) {
        if (expression == null || expression.trim().length() == 0)
            expression = ValidatorUtils.NotHalfHirakana;
        return regexValidator(str,expression);
    }

    private static boolean regexValidator(String str, String expression) {
        Pattern pattern;
        // System.out.println(expression);
        pattern = Pattern.compile(expression, 2);
        Matcher matcher = pattern.matcher(str.trim());
        if (!matcher.matches()) {
            return false;
        }
        return true;
    }
}